package com.crawData.utility;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

import static com.crawData.utility.WebDriverUtility.getProxyList;
import static com.crawData.utility.WebDriverUtility.validateProxy;

/**
 * 视频下载工具类
 */
public class DownLoadFileUtility {
    /**
     * 下载视频到本地
     * @param url
     * @param savePath
     */

    public static void downloadFile(String url, String savePath) {
        // 如果需要，可以设置代理
        // 获取并验证代理
        List<String> proxyList = getProxyList();
        for (String proxyAddress : proxyList) {
            if (validateProxy(proxyAddress)) {
                try {
                    String[] parts = proxyAddress.split(":");
                    String proxyHost = parts[0];
                    int proxyPort = Integer.parseInt(parts[1]);

                    // 设置系统代理
                    System.setProperty("http.proxyHost", proxyHost);
                    System.setProperty("http.proxyPort", String.valueOf(proxyPort));
                    System.setProperty("https.proxyHost", proxyHost);
                    System.setProperty("https.proxyPort", String.valueOf(proxyPort));

                    URL fileUrl = new URL(url);
                    HttpURLConnection httpConn = (HttpURLConnection) fileUrl.openConnection();

                    // 对于 HTTPS，通常不需要额外设置，因为 Java 的 HttpURLConnection 会自动处理 SSL
                    // 但如果你有特殊需求，比如使用自定义的信任管理器或密钥库，你需要在这里配置

                    // 允许从 HTTPS URL 读取数据（这是默认行为，但明确写出来有助于理解）
                    httpConn.setRequestMethod("GET");
                    httpConn.setDoOutput(false); // 对于下载文件，这个通常不需要设置为 true，但设置为 false 也不会影响

                    int responseCode = httpConn.getResponseCode();

                    // 检查响应码是否为 HTTP OK
                    if (responseCode == HttpURLConnection.HTTP_OK) {
                        try (OutputStream outputStream = new FileOutputStream(savePath);
                             InputStream inputStream = httpConn.getInputStream()) {

                            byte[] buffer = new byte[4096];
                            int bytesRead = -1;

                            // 从输入流读取数据并写入到输出流中
                            while ((bytesRead = inputStream.read(buffer)) != -1) {
                                outputStream.write(buffer, 0, bytesRead);
                            }

                            outputStream.flush();
                        }
                    } else {
                        throw new RuntimeException("无法下载文件，HTTP 错误码：" + responseCode);
                    }

                    // 断开连接（虽然 Java 7 及以上版本的 HttpURLConnection 会在 finally 块中自动关闭连接，但明确断开是一个好习惯）
                    httpConn.disconnect();




                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    // 清除系统代理设置
                    System.clearProperty("http.proxyHost");
                    System.clearProperty("http.proxyPort");
                    System.clearProperty("https.proxyHost");
                    System.clearProperty("https.proxyPort");
                }
                break;
            }
        }


    }
}
